package de.nak.terminumfrageapp.dao;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import de.nak.terminumfrageapp.model.Termin;
import de.nak.terminumfrageapp.model.Umfrage;

/**
 * 
 * @description Data Access Object fuer @link Termin
 * @author Cornelia Kugler, Inga Brinkmann
 */
public class TerminDAO {
	/** Hibernate session factory. */
	private SessionFactory sessionFactory;

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	/**
	 * @description erstellt einen Termin.
	 * @param Termin
	 * @return Termin
	 */
	public Termin erstellen(Termin termin) {
		Session currentSession = sessionFactory.getCurrentSession();
		currentSession.save(termin);

		return termin;
	}

	/**
	 * @description loescht einen Termin.
	 * @param termin
	 */
	public void loeschen(Termin termin) {

		Session currentSession = sessionFactory.getCurrentSession();
		currentSession.delete(termin);

	}

	/**
	 * @description laedt eine Liste mit allen Terminen fuer eine Umfrage.
	 * @param Umfrage
	 * @return List<Termin>
	 */
	@SuppressWarnings("unchecked")
	public List<Termin> ladeAlleTermine(Umfrage umfrage) {
		Session currentSession = sessionFactory.getCurrentSession();
		// Query, die fuer eine bestimmten UmfrageId alle Termine ermittelt
		Query query = currentSession
				.createQuery("from Termin as t where umfrage.id ='"
						+ umfrage.getId() + "' order by t.datum, t.uhrzeit");
		return query.list();
	}

	/**
	 * @description speichert einen Termin.
	 * @param Termin
	 */
	public void speichern(Termin termin) {

		Session currentSession = sessionFactory.getCurrentSession();
		currentSession.saveOrUpdate(termin);

	}

	/**
	 * @description laedt einen Termin
	 * @param id
	 * @return Termin
	 */
	public Termin ladeTermin(Long id) {
		Session currentSession = sessionFactory.getCurrentSession();
		return (Termin) currentSession.get(Termin.class, id);
	}
}
